if ( !v->domain->is_pinned )
break;
- cpu_id.phys_id = (x86_cpu_to_apicid[v->vcpu_id] |
- (acpi_get_processor_id(v->vcpu_id) << 8));
+ cpu_id.phys_id =
+ (uint64_t)x86_cpu_to_apicid[v->vcpu_id] |
+ ((uint64_t)acpi_get_processor_id(v->vcpu_id) << 32);
rc = -EFAULT;
if ( copy_to_guest(arg, &cpu_id, 1) )
/*
* Get the physical ID information for a pinned vcpu's underlying physical
* processor. The physical ID informmation is architecture-specific.
- * On x86: id[7:0]=apic_id, id[15:8]=acpi_id, id[63:16]=mbz,
- * and an unavailable identifier is returned as 0xff.
+ * On x86: id[31:0]=apic_id, id[63:32]=acpi_id, and all values 0xff and
+ * greater are reserved.
* This command returns -EINVAL if it is not a valid operation for this VCPU.
*/
#define VCPUOP_get_physid 12 /* arg == vcpu_get_physid_t */
};
typedef struct vcpu_get_physid vcpu_get_physid_t;
DEFINE_XEN_GUEST_HANDLE(vcpu_get_physid_t);
-#define xen_vcpu_physid_to_x86_apicid(physid) ((uint8_t)((physid)>>0))
-#define xen_vcpu_physid_to_x86_acpiid(physid) ((uint8_t)((physid)>>8))
+#define xen_vcpu_physid_to_x86_apicid(physid) \
+ ((((uint32_t)(physid)) >= 0xff) ? 0xff : ((uint8_t)(physid)))
+#define xen_vcpu_physid_to_x86_acpiid(physid) \
+ ((((uint32_t)((physid)>>32)) >= 0xff) ? 0xff : ((uint8_t)((physid)>>32)))
#endif /* __XEN_PUBLIC_VCPU_H__ */